local s = "123456789"

-- 原写法
print(string.byte(s, 1))
-- 语法糖写法(第一个参数省略)
print(s:byte(1))

local f = string.format("%d,%d", 1, 2)
print(f)

----------------------------------
-- 元表 (table表的钩子函数)
t = { a = 15 }
mt = {
    -- 当table 做加法的时候触发
    __add = function(a, b)
        return a.a + b
    end,
    -- 当table中的key不存在时触发
    __index = {
        abc = 123,
        def = 456,
    },
    -- 当table添加元素的时候触发
    __newindex = function(t, k, v)
        -- 调用 rawset 来执行赋值
        rawset(t, k, v)
    end
}

setmetatable(t, mt) -- 为表设置元表的函数
print(t + 1)

print(t["abc"])
t["abcd"] = 119
print(t["abcd"])

-- 面向对象

-- 定义 bag 对象
bag = {}

-- 定义元表 bagmt(mt代表元表的缩写)
bagmt = {
    -- __index = bagmt,  -- 将 __index 指向自身，以实现方法查找

    -- 添加物品到 bag
    put = function(t, item)
        table.insert(t.items, item)
    end,
    -- 从 bag 中取出物品
    take = function(t)
        return table.remove(t.items)
    end,
    -- 列出 bag 中的所有物品
    list = function(t)
        return table.concat(t.items, ",")
    end,
    -- 清空 bag
    clear = function (t)
        t.items = {}
    end,
}

bagmt["__index"] = bagmt

-- 构造函数，用于创建新的 bag 对象
function bag.new ()
    local t = {
        items = {} -- 初始化物品列表
    }
    setmetatable(t, bagmt) -- 设置元表
    return t
end

local b = bag.new()
b:put("apple")
b:put("apple")
b:put("apple")
b:put("apple")
b:put("apple")
print(b:take())
print(b:list())

-- 协程(单线程)
local co = coroutine.create(function ()
    print("hello world!!")

    local r1,r2,r3 = coroutine.yield(1,2,3) -- 暂停协程
    print(r1,r2,r3)
    print("协程运行")
end)

print(type(co))

-- 返回 yield 传入的参数(1,2,3)
print(coroutine.resume(co))
coroutine.resume(co, 4,5,6) -- 恢复协程运行，并传入参数 4,5,6

-- 使用wrap精简协程调用
local co1 = coroutine.wrap(function ()
    print("hello world!!")

    local r1,r2,r3 = coroutine.yield(1,2,3)
    print(r1,r2,r3)
    print("协程运行1")
end)

print(co1())
co1(4,5,6)

print(coroutine.status(co))
print(coroutine.resume(co))